/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package MNtaxsimula;

import java.util.*;
import MDtaxsimula.*;




/**
 *
 * @author FAMILIA
 */
public class Simulacion {

    private int cantTaxisBd;
    private ArrayList <Taxi> taxisActivos;// lista que almacena los taxis que estarán activos en la simulación
    //private ArrayList<Usuario> usuariosSimulacion ;
    private ArrayList <Servicio> listaServicios;
    //private AdministrarBd controladoraBd;
    private int cantidadCalles; //Tamaño en calles de la ciudad
    private int cantidadCarreras;// Tamaño en carreras de la ciudad
    private int horaInicio;
    private int horaFin;
    private int cantLlamRec;// Cantidad de llamadas recibidas
    private conexionMysql con;

    public Simulacion(int cantTaxisBd, ArrayList<Taxi> taxisActivos, ArrayList<Servicio> listaServicios, int cantidadCalles, int cantidadCarreras, int horaInicio, int horaFin, int cantLlamRec) {
        this.cantTaxisBd = cantTaxisBd;
        this.taxisActivos = taxisActivos;
        this.listaServicios = listaServicios;
        this.cantidadCalles = cantidadCalles;
        this.cantidadCarreras = cantidadCarreras;
        this.horaInicio = horaInicio;
        this.horaFin = horaFin;
        this.cantLlamRec = cantLlamRec;
    }


    public Simulacion() {

        cantidadCalles=20;
        cantidadCarreras=20;
        horaInicio=0; // Siempre que se inicia la simulación se comienza en la hora cero
        cantLlamRec=0;

    }
    public int getCantLlamRec() {
        return cantLlamRec;
    }

    public void setCantLlamRec(int cantLlamRec) {
        this.cantLlamRec = cantLlamRec;
    }

    public int getCantTaxisBd() {
        return cantTaxisBd;
    }

    public void setCantTaxisBd(int cantTaxisBd) {
        this.cantTaxisBd = cantTaxisBd;
    }

    public int getCantidadCalles() {
        return cantidadCalles;
    }

    public void setCantidadCalles(int cantidadCalles) {
        this.cantidadCalles = cantidadCalles;
    }

    public int getCantidadCarreras() {
        return cantidadCarreras;
    }

    public void setCantidadCarreras(int cantidadCarreras) {
        this.cantidadCarreras = cantidadCarreras;
    }

    public int getHoraFin() {
        return horaFin;
    }

    public void setHoraFin(int horaFin) {
        this.horaFin = horaFin;
    }

    public int getHoraInicio() {
        return horaInicio;
    }

    public void setHoraInicio(int horaInicio) {
        this.horaInicio = horaInicio;
    }

    public ArrayList<Taxi> getTaxisActivos() {
        return taxisActivos;
    }

    public void setTaxisActivos(ArrayList<Taxi> taxisActivos) {
        this.taxisActivos = taxisActivos;
    }

     /*
     * METODOS CODIFICADOS POR JULIA Y ALEX
     */

    public void moverTaxis(ArrayList <Taxi> taxisActivos)
    {
        Random rand = new Random();
        for(Taxi a:taxisActivos)
        {
            int cll = rand.nextInt(20);
            int cra = rand.nextInt(20);

            a.setCalleActual(cll);
            a.setCarreraActual(cra);
        }
    }

    /*
     * Selecciona el Taxi opcionado para atender el servicio
     */

    public Taxi seleccionarTaxiServicio(ArrayList <Taxi> taxisActivos, Usuario usuarioServicio)
    {
        double distancia = 0.0;
        double resCalles = 0.0;
        double resCarreras = 0.0;
        int indice = 0;

        for(Taxi a:taxisActivos)
        {
            resCalles = Math.pow((usuarioServicio.getCalle()- a.getCalleActual()),2);
            resCarreras = Math.pow((usuarioServicio.getCarrera()- a.getCarreraActual()),2);
            distancia = Math.sqrt(resCalles - resCarreras);
            a.setDistancia(distancia);
        }

        Taxi aux, aux2;
        for (int i=0; i < taxisActivos.size(); i++)
        {
            for (int j=1; j < taxisActivos.size()-1; j++)
            {
                if (taxisActivos.get(i).getDistancia() > taxisActivos.get(j).getDistancia())
                {
                    aux = taxisActivos.get(i);
                    aux2 = taxisActivos.get(j);
                    taxisActivos.add(i, aux2);
                    taxisActivos.add(j, aux);
                }
            }
        }
        for (int i=0; i < 5; i++)
        {
            for (int j=1; j < 4; j++)
            {
                if (taxisActivos.get(i).getCantidadCarrerasAtendidas() > taxisActivos.get(j).getCantidadCarrerasAtendidas())
                {
                    aux = taxisActivos.get(i);
                    aux2 = taxisActivos.get(j);
                    taxisActivos.add(i, aux2);
                    taxisActivos.add(j, aux);
                }
            }
        }
        return taxisActivos.get(indice);
    }
    // FIN CODIGOS JULIA Y ALEX

}
